#ifndef __GAF_SCENE_H__
#define __GAF_SCENE_H__

namespace GAF
{
	//class Graphics -* ForEach
		//class Face
			//class CommandFace
				class Scene;
}
typedef GAF::Scene			GAF_CScene;

namespace GAF
{
	enum ReturnID
	{
		ID_YES,
		ID_NO,
		ID_OK			= ID_YES,
		ID_CANCEL		= ID_NO,
		ID_WAIT,
		ID_UNKNOW		= 254,
		ID_ERROR		= 255,
	};
}
typedef GAF::ReturnID			GAF_EReturnID;
#define GAF_ID_YES			GAF::ID_YES
#define GAF_ID_NO			GAF::ID_NO
#define GAF_ID_OK			GAF::ID_OK
#define GAF_ID_CANCEL			GAF::ID_CANCEL
#define GAF_ID_WAIT			GAF::ID_WAIT
#define GAF_ID_ERROR			GAF::ID_ERROR

namespace GAF
{
	enum SceneState
	{
		SCENE_CREATE,		// 创建
		SCENE_FREE,		// 空闲
		SCENE_START,		// 开始
		SCENE_RUN,		// 运行
		SCENE_PAUSE,		// 暂停
		SCENE_FINISH,		// 完成
		SCENE_EXIT,		// 退出
		SCENE_END,		// 结束
		SCENE_DELETE		// 删除
	};
}
typedef GAF::SceneState			GAF_ESceneState;
#define GAF_SCENE_CREATE		GAF::SCENE_CREATE
#define GAF_SCENE_FREE			GAF::SCENE_FREE
#define GAF_SCENE_START			GAF::SCENE_START
#define GAF_SCENE_RUN			GAF::SCENE_RUN
#define GAF_SCENE_PAUSE			GAF::SCENE_PAUSE
#define GAF_SCENE_FINISH		GAF::SCENE_FINISH
#define GAF_SCENE_EXIT			GAF::SCENE_EXIT
#define GAF_SCENE_END			GAF::SCENE_END
#define GAF_SCENE_DELETE		GAF::SCENE_DELETE



#include "GAF_Define.h"
#include "GAF_CommandFace.h"
#include "GAF_Layout.h"
#include "GAF_Window.h"
#include "GAF_Canvas.h"
#include "GAF_Platform.h"

namespace GAF
{
	/// 场景类
	class _ABSTRACT Scene : public CommandFace
	{
	public:
		Scene();
		virtual ~Scene();

	/**
	 *  @name 事件成员
	 */
		// 继承事件
// 	public:
// 		virtual bool		OnPreRender(Graphics* pGraphics);		// 当渲染场景之前时
// 		virtual bool		OnRender();					// 当渲染场景时
// 	protected:
// 		virtual bool		OnInit(Bundle* pbdlParam);				// 当场景初始化时
// 		virtual void		OnKeyDown(ULONG lCode);			// 当按键按下时
// 		virtual void		OnKeyUp(ULONG lCode);				// 当按键抬起时
// 		virtual void		OnPointDown(ULONG lCode, int nX, int nY);	// 当屏幕点按下时
// 		virtual void		OnPointUp(ULONG lCode, int nX, int nY)	;	// 当屏幕点抬起时
// 		virtual void		OnPointMove(ULONG lCode, int nX, int nY);	// 当屏幕点移动时

		// 定义事件
	public:
		/// 调用场景结束时
		virtual void		OnCallEnd(GAF_CScene* pCallScene)		// 呼叫场景结束时
					{return;}
		/// 得到命令时
		/**
		 *  @return 是否已对本命令作出相应处理
		 */
		virtual bool		OnGetCommand(Command& cmd)			// 得到命令时
					{return false;}

	protected:
		/// 场景开始时
		virtual	bool		OnStart()					// 场景开始时，返回是否允许开始
					{return true;}
		/// 场景恢复时
		virtual void		OnResume()
					{return;}
		/// 场景更新时
		virtual void		OnUpdate()					// 场景更新时
					{return;}
		/// 场景恢复时
		virtual void		OnPause()
					{return;}
		/// 场景结束时
		virtual ReturnID	OnExit(bool isEnforce)				// 场景结束时，返回是否允许结束
					{return ID_YES;}
		/// 场景退出时
		virtual void		OnEnd()						// 场景退出时
					{return;}
		/// 场景销毁时
		virtual void		OnDestroy()
					{return;}

	/**
	 *  @name 其他成员
	 */
	public:
		/// 加载布局
		void			LoadLayout(Layout* pLayout);
		/// 卸载布局
		void			UnloadLayout();
		/// 获得布局
		Layout*			GetLayout();

		/// 设置窗口句柄
		bool			SetWindow(Window* pWindow);
		/// 获得窗口句柄
		Window*			GetWindow();

		/// 调用场景
		void			Show();
		/// 呼叫场景
		void			Call();

		/// 初始化场景
		bool			Init(Bundle* pbdlParam = NULL);
		/// 运行场景
		bool			Start(Scene* pBackScene);
		/// 恢复场景
		void			Resume();
		/// 更新场景
		void			Update();
		/// 暂停场景
		void			Pause();
		/// 退出场景
		ReturnID		Exit(bool isEnforce = false);
		/// 场景结束时
		void			End();
		/// 销毁场景
		void			Destroy();

		/// 是否已完成
		bool			IsFinish();
		/// 是否允许退出
		bool			IsAllowExit();
		/// 取消退出场景
		void			CancelExit();

		/// 获取场景状态
		SceneState		GetState();
		/// 获得场景返回值
		int			GetReturn();

		/// 场景是否为全窗口状态
		bool			IsFullWindow();
		/// 获得底层场景
		Scene*			GetBackScene();
		/// 获得窗口尺寸
		Size*			GetWindowSize();
		/// 获得绘制句柄
		Canvas*			GetCanvas();

	protected:
		/// 返回指定返回值
		void			Return(int nReturn);
		/// 返回“确定”
		void			ReturnOK();
		/// 返回“取消”
		void			ReturnCancel();
		/// 返回“是”
		void			ReturnYes();
		/// 返回“否”
		void			ReturnNo();
		/// 返回错误值
		void			ReturnError(int nErrorCode);

	public:
		/// 设置场景是否为全窗口运行
		void			FullWindow(bool isFullWindow = true);
		/// 更新画布
		void			UpdateCanvas();
		/// 重置画布
		void			ResetCanvas();

	protected:
		/// 焦点
		CommandFace*		m_pFocus;
		/// 是否为全窗口
		bool			m_isFullWindow;
		/// 底层场景
		Scene*			m_pBackScene;
		/// 返回值
		int			m_nReturn;

	private:
		SceneState		m_State;
		bool			m_isAllowExit;		// 是否允许场景退出

	private:
		Layout*			m_pLayout;

		Window*			m_pWindow;
		Canvas*			m_pCanvas;
		bool			m_isUpdateCanvas;

		Platform*		m_pPlatform;		// 用于卸载GAF_ICanvas
	};
}

#endif
